#include "allFiles.h"
#include "led.h"
#include "lcd.h"
#include "key.h"  
#include "touch.h" 
#include "lvgl.h"               
#include "lv_port_disp.h"
#include "lv_port_indev.h"
#include "timer.h"
#include "ui.h"
#include "esp8266.h"
#include "onenet.h"

//ALIENTEK 探索者STM32F407开发板 实验28
//触摸屏实验————库函数版本
//技术支持www.openedv.com
//淘宝店铺：http://eboard.taobao.com  
//广州市星翼科技电子有限公司
//作者：正点原子 @ALIENTEK

/*
//初始设置时间函数
RTC_TimeTypeDef RTC_StartTime;
// 剩余使用寿命
uint32_t life_time[3] = {0};

// 设置初始时间函数
void My_RTC_Init()
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
	PWR_BackupAccessCmd(ENABLE); // 允许访问备份区域
	RCC_LSEConfig(RCC_LSE_ON); // 使能LSE
	while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) // 等待它稳定
	{
		delay_ms(10);
	}
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); // 选择LSE为时钟源
	RCC_RTCCLKCmd(ENABLE); // 使能RTC
	// 配置分频和小时格式
	RTC_InitTypeDef RTC_InitStructure;
	RTC_InitStructure.RTC_AsynchPrediv = 0x7F; // 异步
	RTC_InitStructure.RTC_SynchPrediv = 0xFF; // 同步
	RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; // 24小时制
	RTC_Init(&RTC_InitStructure);
	// 设置初始时间
	RTC_TimeTypeDef RTC_TimeTypeInitStructure;
	RTC_TimeTypeInitStructure.RTC_Hours = 20; // 小时
	RTC_TimeTypeInitStructure.RTC_Minutes = 0; // 分
	RTC_TimeTypeInitStructure.RTC_Seconds = 0; // 秒
	RTC_TimeTypeInitStructure.RTC_H12 = RTC_H12_PM; // 下午
	RTC_SetTime(RTC_Format_BIN, &RTC_TimeTypeInitStructure);
	// 设置初始日期
	RTC_DateTypeDef RTC_DateTypeInitStructure;
	RTC_DateTypeInitStructure.RTC_Date = 23; // 日
	RTC_DateTypeInitStructure.RTC_Month = RTC_Month_February; // 月份
	RTC_DateTypeInitStructure.RTC_WeekDay = RTC_Weekday_Sunday; // 星期几
	RTC_DateTypeInitStructure.RTC_Year = 25; // 哪一年，从2000开始
	RTC_SetDate(RTC_Format_BIN, &RTC_DateTypeInitStructure);
	// 检查并标记初始化已完成
	if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x5053)
	{
		RTC_WriteBackupRegister(RTC_BKP_DR0, 0x5053);
	}
	// initialize current time 
    RTC_TimeTypeDef RTC_TimeTypeStructure;
    RTC_GetTime(RTC_Format_BIN, &RTC_TimeTypeStructure);
    RTC_StartTime = RTC_TimeTypeStructure;
}

// difference calculate function
void GetUptime()
{
    RTC_TimeTypeDef RTC_CurrentTime;
    RTC_GetTime(RTC_Format_BIN, &RTC_CurrentTime);
    // calculate the difference between two time format
    int hours = RTC_CurrentTime.RTC_Hours - RTC_StartTime.RTC_Hours;
    int minutes = RTC_CurrentTime.RTC_Minutes - RTC_StartTime.RTC_Minutes;
    int seconds = RTC_CurrentTime.RTC_Seconds - RTC_StartTime.RTC_Seconds;
	
    // handle cases where time spans days
    if (seconds < 0)
    {
        seconds += 60;
        minutes--;
    }
    if (minutes < 0)
    {
        minutes += 60;
        hours--;
    }
    if (hours < 0)
    {
        hours += 24;
    }
	// 寿命计算，更新duty hours标签，上限10000小时
	lv_label_set_text_fmt(ui_duty_hour_value, "%dh%dm%ds",
		hours, minutes, seconds);
	
	uint32_t hour_rest = 10000 - hours;
	uint32_t minute_rest = 0;
	uint32_t second_rest = 0;
	if(seconds > 0) {
		hour_rest--;
		minute_rest = 59 - minutes;
		second_rest = 60 - seconds;
	} else if(minutes > 0) {
		hour_rest--;
		minute_rest = 60 - minutes;
	}
	life_time[0] = hour_rest;
	life_time[1] = minute_rest;
	life_time[2] = second_rest;
	lv_label_set_text_fmt(ui_total_flow_title, "%dh%dm%ds",
		hour_rest, minute_rest, second_rest);
	if(life_time[1] < 58 && life_time[0] < 10000)
		lv_obj_set_style_bg_color(ui_Button3, lv_palette_main(LV_PALETTE_BLUE), LV_PART_MAIN);
}

static void read_data_task(lv_timer_t *timer)
{	
	// 读取温度，先校准 
	if(DHT11_Read_Data(&dh_temp,&dh_humi) > 0) {
		lv_label_set_text_fmt(ui_temp_value, "error");
	}
	
	// 紫外传感器获取数值
    S12SD_GetValue();
    // Gear_adjustment(); // 档位调节，触屏触发
	
	// 读取浊度
	turbidity = TS_GetData();

	// 其它传感器的数据
	lv_label_set_text_fmt(ui_temp_value, "%d ", dh_temp);	// 温度
	lv_label_set_text_fmt(ui_hum_value, "%d%%", dh_humi); // 湿度
	if(level > 2){
		lv_label_set_text_fmt(ui_ill_value, "0");
	}
	else 
		lv_label_set_text_fmt(ui_ill_value, "%d/ ", level); // 紫外等级
	lv_label_set_text_fmt(ui_turbidity_value, " %.2f", turbidity); // 浊度
	// 温度控制, 10-25; 26-40; 41-55; 56-70
	if(dh_temp <= 25) {
		lv_obj_set_style_bg_color(ui_Button2, lv_color_hex(0x979797), LV_PART_MAIN);
	} else if(dh_temp > 25 && dh_temp <= 40) {
		lv_obj_set_style_bg_color(ui_Button2, lv_palette_main(LV_PALETTE_GREEN), LV_PART_MAIN);
	} else if(dh_temp > 40 && dh_temp <= 55) {
		lv_obj_set_style_bg_color(ui_Button2, lv_palette_main(LV_PALETTE_BLUE), LV_PART_MAIN);
	} else if(dh_temp > 55) {
		lv_obj_set_style_bg_color(ui_Button2, lv_palette_main(LV_PALETTE_RED), LV_PART_MAIN);
	}
}
*/

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置系统中断优先级分组2
	delay_init(168);  // 初始化延时函数
	uart_init(115200);	// usart1串口波特率115200
	uart6_init(115200);	// usart6与esp8266通信
    
	LED_Init(); // LED初始化 
	KEY_Init(); // 按键初始化
// 	LCD_Init(); // LCD初始化	
//	LCD_Display_Dir(1); // 横屏显示
//	tp_dev.init(); // lvgl初始化

	DHT11_Init_Check(); // 温湿度传感器初始化
	/*
	S12SD_Init(); // 紫外传感器初始化 PA5 ADC1通道5
	TS_Init(); // 浊度传感器初始化
	YF_init(); // 水流速传感器初始化
	*/
	TIM2_Init(500-1, 8400-1); // 0.5s一次中断
//	TIM3_Int_Init(84-1,1000-1); // LVGL心跳设置
// 时间初始化函数
//  My_RTC_Init(); // RTC
	
	
/********************************************************************************/
//联网初始化，usart6通信
	unsigned char *dataPtr = NULL;
	ESP8266_Init();
	while( OneNet_DevLink() ) // 设备连接
	delay_ms(500);
/*******************************************************************************/


/*******************************************************************************/
// GUI初始化
	/*
	lv_init();                             // LVGL 总初始化
	lv_port_disp_init();                   // lvgl显示初始化
	lv_port_indev_init();                 // 触摸初始化
	ui_init();
// lvgl周期执行函数
//	Motor_Speed_SET(0);
//	lv_timer_t * my_timer = lv_timer_create(read_data_task, 500, NULL);
	*/
/********************************************************************************/


/********************************************************************************/
// 主函数
	while(1)
	{
		/*
		// 时间，日期的结构体
		RTC_TimeTypeDef RTC_TimeStruct;
		RTC_DateTypeDef RTC_DateStruct;
		char tbuf[40]; // 时间日期字符串
		RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);
		// 获取当前时间
		RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct);
		// 字符串格式化
		sprintf(tbuf, "20%02d-%02d-%02d\n%02d:%02d:%02d", 
			RTC_DateStruct.RTC_Year, RTC_DateStruct.RTC_Month, 
			RTC_DateStruct.RTC_Date, RTC_TimeStruct.RTC_Hours, 
			RTC_TimeStruct.RTC_Minutes, RTC_TimeStruct.RTC_Seconds
		);
		// 修改屏幕标签
		lv_label_set_text_fmt(ui_date_label, "%s", tbuf);
		if(level <= 2) GetUptime();
		
		lv_tick_inc(1); // lvgl心跳
		lv_timer_handler();
        
		// 水流速传感器
		YFS = 1;
		delay_ms(500);
		delay_ms(500);
		delay_ms(500);
		delay_ms(500);
		delay_ms(500);
		delay_ms(500);
		YFS = 0;
		delay_ms(500);
		delay_ms(500); */

		if(dhtFlag==1){
			dhtFlag=0;
			DHT11_Read_Data(&dh_temp,&dh_humi);
			
			OneNet_SendData();
			ESP8266_Clear();
			
			dataPtr = ESP8266_GetIPD(0);
			if(dataPtr != NULL){
				OneNet_RevPro(dataPtr);
			}
		}
	}
}

void TIM2_IRQHandler(void){
	static uint8_t time_count = 0;
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) {
		// 计时1.5s
		time_count ++;
		if(time_count==30){//1.5s			 
			dhtFlag=1;
			time_count=0;
		}
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update); // 清除标志位
	}
}
